#include <iostream>
#include <memory>
#include <typeinfo>
#include <string>
#include <unistd.h>
class Any{
private:
    class hoder{
    public:
        virtual ~hoder() {}
        virtual const std::type_info& type()=0; // 获取类型
        virtual hoder* clone() = 0; // 拷贝
    };
    template<class T>
    class placehoder:public hoder{
    public:
    friend Any;
        placehoder(const T& val):_val(val){}
        virtual const std::type_info& type(){return typeid(_val);} // 获取类型
        virtual hoder* clone(){ // 拷贝
            return new placehoder(_val);
        }
    private:
        T _val;
    };
    hoder* _content;
public:
    Any():_content(nullptr) {}
    template <class T>
    Any(const T& val):_content(new placehoder<T>(val)) {}
    Any(const Any& other):_content(other._content != nullptr ? other._content->clone():nullptr) {}
    ~Any() {
        if(_content)
            delete _content;
    }
    Any& swap(Any& other){
        std::swap(_content,other._content);
        return *this;
    }
    template<class T>
    T* get(){ // 返回子类对象保存的数据的指针
    // 获取的数据类型，必须和保存的数据类型一致
        if(typeid(T) == _content->type())
            // return &((placehoder<T>*)_content)->_val;
            return &(dynamic_cast<placehoder<T>*>(_content))->_val;
        return nullptr;
    }
    template<class T>
    Any& operator=(const T& val){ // 赋值重载
        Any(val).swap(*this);
        return *this;
    }
    Any& operator=(const Any& other){
        Any(other).swap(*this);
        return *this;
    }
    
};


class Test{
public:
    Test(){std::cout << "构造" << std::endl;}
    ~Test(){std::cout << "析构" << std::endl;}
    Test(const Test& t) {std::cout << "拷贝" << std::endl;}
};



// int main(){
//     // Any a;
//     // a = 10;
//     // int* pa = a.get<int>();
//     // std::cout << *pa << std::endl;
//     // a = std::string("nihao");
//     // std::string *ps = a.get<std::string>();
//     // std::cout << (*ps) << std::endl;
//     Any a;
//     Test t;
//     a = t;
//     while(1) sleep(1);
//     return 0;
// }


#include <any>
int main(){
    std::any a;
    a = 10;
    int pa = std::any_cast<int>(a);
    std::cout << pa << std::endl;
    return 0;
}